package com.itrencai.d11_AnliDianying;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.math.BigDecimal;
import java.sql.SQLOutput;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

public class MovieSystem {
    /**
     * 定义系统的数据容器用户存储数据
     * 1.存储很多用户，（客户对象，商家对象）
     */
    public static final  List<User> ALL_USERS=new ArrayList<>();
    //2.存储系统存放全部商家和拍片信息
    public static final Map<Business,List<Movie>> ALL_MOVIES=new HashMap<>();

    public static final Scanner SYS_SC=new Scanner(System.in);
    //定义一个静态的User类型的变量记录当前登录成功的用户对象
    public static  User loginUser;
    public static SimpleDateFormat sdf=new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");

    public static final Logger LOGGER= LoggerFactory.getLogger("MovieSystem.class");

    //3.准备一些测试数据
    static {
        Customer c=new Customer();
        c.setLoginName("zyf888");
        c.setPassWord("123456");
        c.setUserName("王刚");
        c.setSex('男');
        c.setMoney(10000);
        c.setPhone("110110");
        ALL_USERS.add(c);

        Customer c1=new Customer();
        c.setLoginName("gzl888");
        c.setPassWord("123456");
        c.setUserName("王晓红");
        c.setSex('女');
        c.setMoney(2000);
        c.setPhone("111111");
        ALL_USERS.add(c1);

        Business b=new Business();
        b.setLoginName("baozugong888");
        b.setPassWord("123456");
        b.setUserName("包租公");
        b.setMoney(0);
        b.setSex('男');
        b.setPhone("110110");
        b.setAddress("火星6号2B二层");
        b.setShopName("甜甜圈国际影城");
        ALL_USERS.add(b);
        //商家一定要加入到店铺拍片信息中去
        List<Movie> movies=new ArrayList<>();
        ALL_MOVIES.put(b,movies);

        Business b2=new Business();
        b.setLoginName("baozupo888");
        b.setPassWord("123456");
        b.setUserName("包租婆");
        b.setMoney(0);
        b.setSex('女');
        b.setPhone("110110");
        b.setAddress("火星8号8B八层");
        b.setShopName("巧克力国际影城");
        ALL_USERS.add(b2);
        //商家一定要加入到店铺拍片信息中去
        List<Movie> movies3=new ArrayList<>();
        ALL_MOVIES.put(b2,movies3);


    }



    public static void main(String[] args) {
        showMain();

    }

    /**
     * 首页展示
     */
    private static void showMain() {
        while (true) {
        System.out.println("===========电影系统首页================");
        System.out.println("1.登录");
        System.out.println("2.用户注册");
        System.out.println("3.商家注册");
            System.out.println("请输入操作命令：");
            String commond= SYS_SC.nextLine();
            switch (commond){
                case "1":
                    //登录
                    login();
                    break;
                case "2":
                    break;
                case "3":
                    break;
                default:
                    System.out.println("命令有误，请确认！");
            }
        }
    }

    //登录功能
    private static void login() {
        while (true) {
            System.out.println("请输入登录名称：");
            String loginName=SYS_SC.nextLine();
            System.out.println("请输入登录密码：");
            String passWord=SYS_SC.nextLine();
            //1.根据登录名称查询用户对象
            User u=getUserByLoginName(loginName);
            //2.判断用户对象是否存在,存在说明登录名有效
            if(u!=null){
                //3.比对密码是否正确
                if(u.getPassWord().equals(passWord)){
                    //登录成功了
                    loginUser=u;//记住登录成功的用户
                    LOGGER.info(u.getUserName()+"登陆了系统-----");
                    //判断是用户登录的还是商家登录的，
                    if(u instanceof Customer){
                        //当前登录的是普通客户
                        showCustomerMain();
                    }else{
                        //当前登录的是商家客户
                        showBusinessMain();
                    }
                    return;
                }else{
                    System.out.println("密码输入错误");
                }
            }else{
                System.out.println("登录名称错误，请确认");
            }
        }


    }

    //商家后台操作界面
    private static void showBusinessMain() {
        while (true){
            System.out.println("==============电影商家界面=============");
            System.out.println(loginUser.getUserName()+(loginUser.getSex()=='男'?"先生":"女士"+"欢迎您进入系统"));
            //System.out.println(user.getUserName()+(user.getSex()=='男'?"先生":"女士")+"您好，请您输入想要操作的功能：");
            System.out.println("1.展示详情：");
            System.out.println("2.上架电影：");
            System.out.println("3.下架电影：");
            System.out.println("4.修改电影：");
            System.out.println("5.退出：");
            System.out.println("请输入您想要操作的命令：");
            String commond=SYS_SC.nextLine();
            switch (commond){
                case"1":
                    //展示详情
                    showBusinessInfos();
                    break;
                case"2":
                    //上架电影信息
                    addMovie();
                    break;
                case"3":
                    //下架电影
                    deleteMovie();
                    break;
                case"4":
                    //修改电影
                    updateMovie();
                    break;
                case"5":
                    System.out.println(loginUser.getUserName()+"请您下次再来！！！");
                    return;
                default:
                    System.out.println("不存在该命令！！");
                    break;

            }

        }

    }

    //影片修改功能
    private static void updateMovie() {
        System.out.println("================修改电影=================");
        Business business= (Business) loginUser;
        List<Movie> movies=ALL_MOVIES.get(business);
        if(movies.size()==0){
            System.out.println("当前无片可以修改");
            return;
        }
        //2.让用户选择需要修改的电影名称
        while (true) {
            System.out.println("请您输入需要修改的电影名称:" );
            String movieName=SYS_SC.nextLine();

            //3.查询有没有这个影片对象
            Movie movie=getMovieByName(movieName);
            if(movie!=null){
                //修改
                System.out.println("请您输入修改后的影片名：");
                String name=SYS_SC.nextLine();
                System.out.println("请您输入修改后的主演：");
                String actor=SYS_SC.nextLine();
                System.out.println("请您输入修改后的时长：");
                String time=SYS_SC.nextLine();
                System.out.println("请您输入修改后的票价：");
                String price=SYS_SC.nextLine();
                System.out.println("请您输入修改后的票数：");
                String totalNumber=SYS_SC.nextLine();//200\n
                while (true) {
                    try {
                        System.out.println("请您输入修改后的影片放映时间：");
                        String stime=SYS_SC.nextLine();
                        movie.setName(name);
                        movie.setActor(actor);
                        movie.setPrice(Double.valueOf(price));
                        movie.setTime(Double.valueOf(time));
                        movie.setNumber(Integer.valueOf(totalNumber));
                        movie.setStartTime(sdf.parse(stime));
                        System.out.println("恭喜您成功修改了该影片！！！");
                        showBusinessInfos();
                        return;//直接退出去
                    } catch (Exception e) {
                        e.printStackTrace();
                        LOGGER.error("时间解析出了问题");
                    }
                }

            }else{
                System.out.println("您的店铺没有上架该影片");
                System.out.println("请问继续修改吗？y/n");
                String command=SYS_SC.nextLine();
                switch (command){
                    case"y":

                        break;
                    default:
                        System.out.println("好的");
                        return;
                }
            }
        }
    }

    //影片下架功能
    private static void deleteMovie() {
        System.out.println("================下架电影=================");
        Business business= (Business) loginUser;
        List<Movie> movies=ALL_MOVIES.get(business);
        if(movies.size()==0){
            System.out.println("当前无片可以下架");
            return;
        }

        //2.让用户选择需要下架的电影名称
        while (true) {
            System.out.println("请您输入需要下架的电影名称:" );
            String movieName=SYS_SC.nextLine();

            //3.查询有没有这个影片对象
            Movie movie=getMovieByName(movieName);
            if(movie!=null){
                //下架
                movies.remove(movie);
                System.out.println("您当前内部已经成功下架了:"+movie.getName());
                showBusinessInfos();
                return;
            }else{
                System.out.println("您的店铺没有上架该影片");
                System.out.println("请问继续吗？y/n");
                String command=SYS_SC.nextLine();
                switch (command){
                    case"y":
                        break;
                    default:
                        System.out.println("好的");
                        return;
                }
            }
        }

    }

    //查询当前商家下的排片
    public static Movie getMovieByName(String movieName){
        Business business= (Business) loginUser;
        List<Movie> movies=ALL_MOVIES.get(business);
        for (Movie movie : movies) {
            if(movie.getName().contains(movieName)){
                return  movie;
            }
        }
        return null;

    }

    //商家进行电影上架
    private static void addMovie() {
        System.out.println("================下架电影=================");
        //根据商家对象（LoginUser就是当前登录的用户）作为map集合的键提取对应的值就是拍片信息，Map<Business,List<Movies>ALL_MOVIES
        Business business= (Business) loginUser;
        List<Movie> movies=ALL_MOVIES.get(business);
        System.out.println("请您输入影片名：");
        String name=SYS_SC.nextLine();
        System.out.println("请您输入主演：");
        String actor=SYS_SC.nextLine();
        System.out.println("请您输入时长：");
        String time=SYS_SC.nextLine();
        System.out.println("请您输入票价：");
        String price=SYS_SC.nextLine();
        System.out.println("请您输入票数：");
        String totalNumber=SYS_SC.nextLine();//200\n
        while (true) {
            try {
            System.out.println("请您输入影片放映时间：");
            String stime=SYS_SC.nextLine();
            //public Movie(String name,String actor,double scare,int time,double price, int number)
            //封装成电影对象，加入集合movies中去
                Movie movie =new Movie(name,actor,Double.valueOf(time),Double.valueOf(price),Double.valueOf(totalNumber),
                        Integer.valueOf(totalNumber),sdf.parse(stime));
                movies.add(movie);
                System.out.println("您成功上架了：《"+movie.getName()+"》");
                return;//直接退出去
            } catch (ParseException e) {
                e.printStackTrace();
                LOGGER.error("时间解析出了问题");
            }
        }
    }

    //展示当前商家的详细信息
    private static void showBusinessInfos() {
        System.out.println("==============商家详情界面==================");
        LOGGER.info(loginUser.getUserName()+"商家正在看自己的详情-----");
        //根据商家对象（LoginUser就是当前登录的用户）作为map集合的键提取对应的值就是拍片信息，Map<Business,List<Movies>ALL_MOVIES
        Business business= (Business) loginUser;
        System.out.println(business.getShopName()+"\t\t电话："+business.getPhone()
                +"\t\t地址："+business.getAddress()+"\t\t余额："+business.getMoney());
        List<Movie> movies=ALL_MOVIES.get(business);
        if(movies.size()>0){
            System.out.println("片名\t\t\t主演\t\t时长\t\t评分\t\t票价\t\t余票数量\t\t放映时间");
            for (Movie movie : movies) {
                System.out.println(movie.getName()+"\t\t\t"+movie.getActor()+"\t\t\t"+movie.getTime()
                        +"\t\t\t"+movie.getScore()+"\t\t\t"+movie.getPrice()+"\t\t\t"+movie.getNumber()+"\t\t\t"+sdf.format(movie.getStartTime()));
            }
        }else{
            System.out.println("您的店铺当前无片可播~~~~");
        }


    }

    //客户操作页面
    private static void showCustomerMain() {
        while(true){
            System.out.println("===========电影客户界面============");
            System.out.println(loginUser.getUserName()+(loginUser.getSex()=='男'?"先生":"女士"+"欢迎您进入系统"+
                    "\t余额"+loginUser.getMoney()));
            System.out.println("请您选择操作的功能：");
            System.out.println("1.展示全部影片信息功能：");
            System.out.println("2.根据电影名查询影片信息：");
            System.out.println("3.评分功能：");
            System.out.println("4.购票功能：");
            System.out.println("5.退出系统：");

            System.out.println("请输入您要操作的命令：");
            String commond=SYS_SC.nextLine();
            switch (commond){
                case"1":
                    //显示全部影片信息
                    showAllMovies();
                    break;
                case"2":
                    //

                    break;
                case"3":
                    //评分功能

                    break;
                case"4":
                    //购票功能
                    buyMovie();
                    break;
                case"5":
                    //干掉方法
                    return;
                default:
                    System.out.println("不存在该命令！！");
                    break;
            }
        }
    }

    //用户购票功能
    private static void buyMovie() {
        showAllMovies();
        System.out.println("=============用户购票功能=================");
        while (true) {
            System.out.println("请您输入需要买票的门店：");
            String shopName=SYS_SC.nextLine();
            //1.查询是否存在该商家
            Business business=getBusinessShopName(shopName);
            if(business==null){
                System.out.println("对不起，没有该店铺，请确认");
            }else{
                //2.此商家全部的排片
                List<Movie> movies=ALL_MOVIES.get(business);
                //3.判断是否存在上映的电影
                if(movies.size()>0){
                    //4.开始进行选片购买
                    while (true) {
                        System.out.println("请您输入需要购买的电影名称：");
                        String movieName=SYS_SC.nextLine();
                        //去当前商家下查询该电影对象
                        Movie movie=getMovieByShopAndName(business,movieName);
                        if(movie!=null){
                            //开始购票
                            while (true) {
                                System.out.println("请您输入要购买的电影票数：");
                                String number=SYS_SC.nextLine();
                                int buyNumber=Integer.valueOf(number);
                                //判断电影是否购票
                                if(movie.getNumber()>=buyNumber){
                                    //可以购买了
                                    //当前需要花费的金额
                                    double money= BigDecimal.valueOf(movie.getPrice())
                                            .multiply(BigDecimal.valueOf(buyNumber)).doubleValue();
                                    if(loginUser.getMoney()>=money){
                                        //终于可以买票了
                                        System.out.println("您成功购买了"+movie.getName()+buyNumber+"张票，总金额是"+money);
                                        //更新自己的金额并且更新商家的金额
                                        loginUser.setMoney(loginUser.getMoney()-money);
                                        business.setMoney(business.getMoney()+money);
                                        movie.setNumber(movie.getNumber()-buyNumber);
                                        return;//结束方法
                                    }else{
                                        //钱不够
                                        System.out.println("是否继续~~");
                                        System.out.println("是否继续买票？y/n");
                                        String command=SYS_SC.nextLine();
                                        switch (command){
                                            case"y":
                                                break;
                                            default:
                                                System.out.println("好的");
                                                return;
                                        }
                                    }
                                }else{
                                    //票数不够
                                    System.out.println("您当前最多可以购买："+movie.getNumber());
                                    System.out.println("是否继续买票？y/n");
                                    String command=SYS_SC.nextLine();
                                    switch (command){
                                        case"y":
                                            break;
                                        default:
                                            System.out.println("好的");
                                            return;
                                    }
                                }
                            }
                        }else{
                            System.out.println("电影名称错误！");
                        }
                    }
                }else{
                    System.out.println("该电影院关门了！");
                    System.out.println("是否继续买票？y/n");
                    String command=SYS_SC.nextLine();
                    switch (command){
                        case"y":
                            break;
                        default:
                            System.out.println("好的");
                            return;
                    }
                }
            }
        }


    }

    //
    public static Movie getMovieByShopAndName(Business business,String name){
        List<Movie> movies=ALL_MOVIES.get(business);
        for (Movie movie : movies) {
            if(movie.getName().contains(name)){
                return movie;
            }
        }
        return null;
    }

    //根据商家店铺名称查询商家对象
    public static Business getBusinessShopName(String shopName){
        Set<Business> businesses =ALL_MOVIES.keySet();
        for (Business business : businesses) {
            if(business.getShopName().equals(shopName)){
                return business;
            }
        }
        return null;
    }




    //用户功能：展示全部商家和其排片信息
    private static void showAllMovies() {
        System.out.println("=============展示全部商家排片信息=================");
        ALL_MOVIES.forEach((business, movies) -> {
            System.out.println(business.getShopName()+"\t\t电话："+business.getPhone()+"\t\t地址："+business.getAddress());
            System.out.println("\t\t\t片名\t\t\t主演\t\t时长\t\t评分\t\t票价\t\t余票数量\t\t放映时间");
            for (Movie movie : movies) {
                System.out.println(movie.getName()+"\t\t\t"+movie.getActor()+"\t\t\t"+movie.getTime()
                        +"\t\t\t"+movie.getScore()+"\t\t\t"+movie.getPrice()+"\t\t\t"+movie.getNumber()+"\t\t\t"+sdf.format(movie.getStartTime()));
            }
        });
    }

    //查找用户对象
    public static User getUserByLoginName(String loginName) {
        for (User user : ALL_USERS) {
            //判断用户登录名是否是我们想要的
            if(user.getLoginName().equals(loginName)){
                return  user;
            }


        }
        return null;//查无此用户

    }



















}
